/*
 * H26xPropDetector.h
 *
 *  Created on: 2017年3月7日
 *      Author: chuanjiang.zh
 */

#ifndef H26xPropDetector_H_
#define H26xPropDetector_H_

#include "UMediaType.h"
#include <string>

namespace av
{

/**
 * H264/H265 解码参数检测器
 * 从流中抽取出sps,pps等参数, 拼接在一起
 */
class H26xPropDetector
{
public:
	H26xPropDetector();
	virtual ~H26xPropDetector();

	explicit H26xPropDetector(int codecID);

	bool setCodec(int codecID);

	bool detect(const uint8_t* data, int size, bool& isKeyFrame, int& naluType);

	bool isReady() const;

	std::string getProp() const;

	void clear();

	std::string getVps() const;
	std::string getSps() const;
	std::string getPps() const;

	void setProp(const uint8_t* sprop, int size);
	void setProp(const std::string& sprop);

    bool isIFrame(int naluType);

	static std::string joinSprop(const std::string& sps, const std::string& pps);
	static std::string joinSprop(const std::string& vps, const std::string& sps, const std::string& pps);


	const char* getProp(int& size) const;

	const char* getVps(int& size) const;
	const char* getSps(int& size) const;
	const char* getPps(int& size) const;

protected:
	bool detectH264(const uint8_t* data, int size, bool& isKeyFrame, int& naluType);
	bool detectH265(const uint8_t* data, int size, bool& isKeyFrame, int& naluType);

	bool parseH264Nalu(const uint8_t* data, size_t length, int& naluType);
	bool parseH265Nalu(const uint8_t* data, size_t length, int& naluType);

protected:
	int	m_codecID;
	std::string	m_prop;

	std::string	m_vps;
	std::string	m_sps;
	std::string	m_pps;


};


} /* namespace av */

#endif /* H26xPropDetector_H_ */
